﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.ComponentModel;

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

using ThoughtWorks.QRCode.Codec;

namespace TireBias.Models
{
   public class QRCodeHtmlHelper
   {
      /// <summary>
      /// 인코더의 정보 얻기
      /// </summary>
      /// <param name="mimeType">mimetype</param>
      /// <returns>ImageCodecInfo</returns>
      //public static ImageCodecInfo GetEncoderInfo(String mimeType)
      //{
      //   int j;
      //   ImageCodecInfo[] encoders;
      //   encoders = ImageCodecInfo.GetImageEncoders();
      //   for (j = 0; j < encoders.Length; ++j)
      //   {
      //      if (encoders[j].MimeType == mimeType)
      //         return encoders[j];
      //   }
      //   return null;
      //}

      public static byte[] enCode_barcode(string s, int version = 7, int scale = 4)
      //public static Image enCode_barcode(string s, int version = 7, int scale = 4)
      {
         QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
         qrCodeEncoder.QRCodeEncodeMode = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ENCODE_MODE.BYTE;
         qrCodeEncoder.QRCodeScale = scale;
         qrCodeEncoder.QRCodeVersion = version;
         qrCodeEncoder.QRCodeErrorCorrect = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ERROR_CORRECTION.M;
         Bitmap img = qrCodeEncoder.Encode(s);
         byte[] ConvertedByteArray = null;
         using (System.IO.MemoryStream memorystream = new System.IO.MemoryStream())
         {
            img.Save(memorystream, System.Drawing.Imaging.ImageFormat.Jpeg);
            ConvertedByteArray = memorystream.ToArray();
         }
         return ConvertedByteArray;

      }



      /// <summary>
      /// Produces the markup for an image element that displays a QR Code image, as provided by Google's chart API.
      /// </summary>
      /// <param name="htmlHelper"></param>
      /// <param name="data">The data to be encoded, as a string.</param>
      /// <param name="size">The square length of the resulting image, in pixels.</param>
      /// <param name="margin">The width of the border that surrounds the image, measured in rows (not pixels).</param>
      /// <param name="errorCorrectionLevel">The amount of error correction to build into the image.  Higher error correction comes at the expense of reduced space for data.</param>
      /// <param name="htmlAttributes">Optional HTML attributes to include on the image element.</param>
      /// <returns></returns>
      //   public static MvcHtmlString QRCode(this HtmlHelper htmlHelper, string data, int size = 80
      //      , int margin = 4, QRCodeErrorCorrectionLevel errorCorrectionLevel = QRCodeErrorCorrectionLevel.Low, object htmlAttributes = null)
      //   {
      //      if (data == null)
      //         throw new ArgumentNullException("data");
      //      if (size < 1)
      //         throw new ArgumentOutOfRangeException("size", size, "Must be greater than zero.");
      //      if (margin < 0)
      //         throw new ArgumentOutOfRangeException("margin", margin, "Must be greater than or equal to zero.");
      //      if (!Enum.IsDefined(typeof(QRCodeErrorCorrectionLevel), errorCorrectionLevel))
      //         throw new InvalidEnumArgumentException("errorCorrectionLevel", (int)errorCorrectionLevel, typeof(QRCodeErrorCorrectionLevel));

      //      var url = string.Format("http://chart.apis.google.com/chart?cht=qr&chld={2}|{3}&chs={0}x{0}&chl={1}", size, HttpUtility.UrlEncode(data), errorCorrectionLevel.ToString()[0], margin);

      //      var tag = new TagBuilder("img");
      //      if (htmlAttributes != null)
      //         tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
      //      tag.Attributes.Add("src", url);
      //      tag.Attributes.Add("width", size.ToString());
      //      tag.Attributes.Add("height", size.ToString());

      //      return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing));
      //   }


      //public enum QRCodeErrorCorrectionLevel
      //{
      //   /// <summary>Recovers from up to 7% erroneous data.</summary>
      //   Low,
      //   /// <summary>Recovers from up to 15% erroneous data.</summary>
      //   Medium,
      //   /// <summary>Recovers from up to 25% erroneous data.</summary>
      //   QuiteGood,
      //   /// <summary>Recovers from up to 30% erroneous data.</summary>
      //   High
      //}
   }
}